/**
 * Copyright &copy; 2012-2016 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
 */
package org.jeecg.common.util;

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
/*import com.thinkgem.jeesite.common.annotation.FieldName;
import com.thinkgem.jeesite.common.utils.Encodes;
import com.thinkgem.jeesite.common.utils.ObjectUtils;
import com.thinkgem.jeesite.modules.act.entity.Act;
import com.thinkgem.jeesite.modules.oa.entity.Leave;
import com.thinkgem.jeesite.modules.oa.entity.OverTimeWork;
import com.thinkgem.jeesite.modules.sys.entity.ActRole;
import com.thinkgem.jeesite.modules.sys.entity.ActUser;
import org.activiti.engine.impl.persistence.entity.GroupEntity;
import org.activiti.engine.impl.persistence.entity.UserEntity;*/

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 流程工具
 * 
 * @author ThinkGem
 * @version 2013-11-03
 */
public class ActUtils {

	// private static Logger logger = LoggerFactory.getLogger(ActUtils.class);

	/**
	 * 定义流程定义KEY，必须以“PD_”开头 组成结构：string[]{"流程标识","业务主表表名"}
	 */
	public static final String[] PD_LEAVE = new String[] { "leave", "oa_leave", "PD001", "请假申请" };
	public static final String[] PD_OVERTIME_WORK = new String[] { "overTimeWork", "oa_overtime_work", "PD008", "加班申请" };
	public static final String[] PD_HOLIDAY = new String[] { "holiday", "hr_holiday_new", "PD015", "延期申请" };
	public static final String[] PD_USER = new String[] { "user", "sys_user_ex", "PD017", "账号申请" };
	public static final String[] PD_QUIT = new String[] { "user", "sys_user_ex", "PD018", "离职申请" };



	public static final String[] PD_TEST_AUDIT = new String[] { "test_audit", "oa_test_audit" };
	public static final String[] PD_BUSINESS_TRIP = new String[] { "businessTrip", "oa_business_trip" };
	public static final String[] PD_INSPECTION = new String[] { "inspection", "project_inspection" };
	public static final String[] PD_ELEVATOR = new String[] { "elevator", "project_task" };
	public static final String[] PD_PLANCONFIGURE = new String[] { "planConfigure", "oa_hr_plan" };
	public static final String[] PD_STOCK_IN = new String[] { "stockIn", "ck_material_stock_in" };
	public static final String[] PD_WAREHOUSE_OUT = new String[] { "warehouseOut", "ck_material_stock_out" };
	public static final String[] PD_DIMISSION = new String[] { "dimission", "oa_hr_dimission" };
	public static final String[] PD_PERSONNEL_TRANSFER = new String[] { "personnelTransfer",
			"oa_hr_personnel_transfer" };
	public static final String[] PD_EMPLOYEE_REWARD = new String[] { "employeeReward", "oa_hr_employee_reward" };
	public static final String[] PD_PROCUREMENT = new String[] { "procurement", "ck_procurement" };
	public static final String[] PD_WAREHOUSE_INVENTORY = new String[] { "inventory", "ck_material_inventory" };
	
	public static final String[] PD_WAREHOUSE_SUPPLIER = new String[] { "supplier", "ck_supplier_appraise" };
	public static final String[] PD_SUPPLIER_YEAR_Audit = new String[] { "supplierYearAudit",
			"ck_supplier_year_audit" };
	public static final String[] PD_REIMBURSEMENT = new String[] { "reimbursement", "oa_reimbursement" };
	public static final String[] PD_CONTRACT = new String[] { "contract", "wy_contract", "PD002", "合同申请" };
	public static final String[] PD_BIND = new String[] { "bind", "hr_bind", "PD003", "解绑(锁)申请" };
	/** 仓库  */
	public static final String[] PD_OAPROCUREMENT = new String[] { "procurement", "oa_procurement", "PD006", "采购申请" };
	public static final String[] PD_PURCHASE =new String[] {"purchase","ck_purchase","PD009","进货申请"};
    public static final String[] PD_STOCKIN = new String[] {"stock_in","ck_material_stock_in","PD010","入库申请"};
    public static final String[] PD_MAINACTIVITY = new String[] { "mainActivity", "oa_mainActivity", "PD007", "领料申请" };
    public static final String[] PD_SCRAP = new String[] { "scrap","ck_scrap", "PD011", "报废申请" };
    public static final String[] PD_BORROW = new String[] { "borrow", "ck_borrow" , "PD012", "借用申请" };
    public static final String[] PD_DISPATCH = new String[] { "dispatch", "ck_dispatch" , "PD013", "调拨申请" };
    public static final String[] PD_BACK = new String[] { "back", "ck_back" , "PD014", "还库申请" };
    /** 报修申请 */
	public static final String[] PS_REPAIR = new String[] { "repair", "wy_repair", "PS003", "报修" };
	public static final String[] PS_COMPLAINT = new String[] { "complaintProposal", "wy_complaint_proposal", "PS004", "投诉" };
	public static final String[] PS_REPAIR_BILL = new String[] { "repairBill", "wy_repair_bill", "PS005", "维修工单" };
	public static final String[] PD_COMPLAINT = new String[] { "complaint", "wy_complaint", "PS004", "投诉" };
	
	
	public static final String[] PD_SEAL = new String[]{"seal","oa_seal","PD016","用印申请"};

	/** session有效期 */
	public static long SESSION_TIME_OUT = 30 * 60 * 1000; // 单位毫秒

	/**
	 * 自定义评论表的主题类型 根据 key -----> value
	 */
/*	private static final Map<String, Object> JD_MAP;
	static {		JD_MAP = new HashMap<String, Object>();
		JD_MAP.put("PD001", new Object[] { "leave", "oa_leave", "工作日志", new Leave() });
		JD_MAP.put("PD002", new String[] { "leave", "oa_leave", "请假申请" });
		JD_MAP.put("PD008", new Object[] { "overTimeWork", "oa_overtime_work", "加班申请" , new OverTimeWork() });
	}

	public static Object getMapValue(String key) {
		if (JD_MAP.containsKey(key)) {
			return JD_MAP.get(key);
		}
		return null;
	}*/

	/** 系统消息的分类名称 */
	private static final Map<String, String> MSG_MAP;
	static {
		MSG_MAP = new HashMap<String, String>();
		MSG_MAP.put("PD", "流程通知消息");
		MSG_MAP.put("AS", "系统管理员分配通知消息");
		MSG_MAP.put("JG", "留言评论通知消息");
		MSG_MAP.put("PS", "报修维修投诉消息");
	}

	public static String getMsgMapValue(String key) {
		if (MSG_MAP.containsKey(key)) {
			return MSG_MAP.get(key);
		}
		return null;
	}

	/** 流程审批结果的变量名称 */
	public static final String AUDIT_RES = "auditRes";
	/** 流程审批结果的code值 0：发起申请 */
	public static final String AUDIT_RES_CODE_0 = "0";
	/** 流程审批结果的code值 1：已同意 */
	public static final String AUDIT_RES_CODE_1 = "1";
	/** 流程审批结果的code值 2：已驳回 */
	public static final String AUDIT_RES_CODE_2 = "2";
	/** 流程审批结果的code值 3：已重新申请 */
	public static final String AUDIT_RES_CODE_3 = "3";
	/** 流程审批结果的code值 4：已取消申请 */
	public static final String AUDIT_RES_CODE_4 = "4";
	/** 流程审批结果值和名称的对应 */
	private static final Map<String, String> PD_RES_MAP;
	static {
		PD_RES_MAP = new HashMap<String, String>();
		PD_RES_MAP.put(AUDIT_RES_CODE_0, "发起申请");
		PD_RES_MAP.put(AUDIT_RES_CODE_1, "已同意");
		PD_RES_MAP.put(AUDIT_RES_CODE_2, "已驳回");
		PD_RES_MAP.put(AUDIT_RES_CODE_3, "已重新申请");
		PD_RES_MAP.put(AUDIT_RES_CODE_4, "已取消申请");
	}

	public static String getPDResValue(String key) {
		if (PD_RES_MAP.containsKey(key)) {
			return PD_RES_MAP.get(key);
		}
		return null;
	}

	// /**
	// * 流程定义Map（自动初始化）
	// */
	// private static Map<String, String> procDefMap = new HashMap<String,
	// String>() {
	// private static final long serialVersionUID = 1L;
	// {
	// for (Field field : ActUtils.class.getFields()){
	// if(StringUtils.startsWith(field.getName(), "PD_")){
	// try{
	// String[] ss = (String[])field.get(null);
	// put(ss[0], ss[1]);
	// }catch (Exception e) {
	// logger.debug("load pd error: {}", field.getName());
	// }
	// }
	// }
	// }
	// };
	//
	// /**
	// * 获取流程执行（办理）URL
	// * @param procId
	// * @return
	// */
	// public static String getProcExeUrl(String procId) {
	// String url = procDefMap.get(StringUtils.split(procId, ":")[0]);
	// if (StringUtils.isBlank(url)){
	// return "404";
	// }
	// return url;
	// }

	// 极光推送
	public static String APP_KEY = "e04096c2def738e7803fab1e";
	public static String MASTER_SECRET = "899fded95c7583354b5c013f";

	// ================流程推送消息格式 START====================
	/** 流程首次申请 提醒的通知 : %s提交了%s,请及时处理 */
	public static String SMS_PD_AUDIT = "%s提交了%s,请及时处理";
	/** 流程重新申请后 提醒的通知:%s重新修改了%s,请及时处理 */
	public static String SMS_PD_MODIFY = "%s重新修改了%s,请及时处理";
	/** 流程被驳回 提醒的通知:%s驳回了你的%s,请重新申请 */
	public static String SMS_PD_BACK = "%s驳回了你的%s,请重新申请";
	/** 工程的工单不通过 **/
	public static String PRO_PD_BACK = "%s申请的%s工单作废,请另启工单";
	/** 流程全部结束时 给申请者提醒的通知:您的%s,已被审批通过 */
	public static String SMS_PD_END = "您的%s,已被审批通过";
	/** 流程特殊通知(例如：请假时给HR发送通知):%s提交了%s,请关注 */
	public static String SMS_PD_ONE = "%s提交了%s,请关注";
	
	public static String SMS_PD_REAPIRT = "你的维修工已经超时,请及时处理";

	/** 推送对应的具体业务的状态 0:待签收 */
	public static String OPERTION_STATUS_0 = "0";
	/** 推送对应的具体业务的状态 1:待审批 */
	public static String OPERTION_STATUS_1 = "1";
	/** 推送对应的具体业务的状态 2:重新申请 */
	public static String OPERTION_STATUS_2 = "2";
	/** 推送对应的具体业务的状态 3:周知 */
	public static String OPERTION_STATUS_3 = "3";

	// ================流程推送消息格式 END====================

	// ================系统管理员推送消息格式 START====================
	/** 系统管理员分配 提醒通知 */
	public static String SMS_ASSIGN_ONE = "%s给您分配了【%s】账号,请查收.";
	/** 系统管理员分配 收回通知 */
	public static String SMS_ASSIGN_TWO = "%s已收回之前分配的【%s】账号";

	public static String SMS_ASSIGN_THREE = "分配的评论员【%s】使用期限已到，系统自动回收";

	// ================系统管理员推送消息格式 END====================

	// ================日志周报的留言推送消息格式 START=====================
	public static String SMS_COMMENT_ONE = "【%s】对你的%s做了留言"; // 【张三】对你的日志做了留言
	public static String SMS_COMMENT_TWO = "【%s】回复了你的留言(%s)"; // 【张三】回复了你的留言(日志)
	public static String SMS_COMMENT_THREE = "【%s】回复了你【%s身份】的留言"; // 【张三】回复了你的【总部系统管理员7身份】的留言
	public static String SMS_COMMENT_FOUR = "您参与评论的【%s】%s，【%s】做了新的留言"; // 您参与评论的【张三】日志，【李四】做了新的留言
	// ================日志周报的留言推送消息格式 END=======================

	// =================================职位=============================
	/** 特殊值:公司主管 1 */
	public static String POSITION_ONE = "1";
	/** 特殊值:部门主管 2 */
	public static String POSITION_TWO = "2";

	// 对应字典sys_user_position的值
	/** 职位： 总经理1010 */
	public static String POSITION_1_1 = "1010";
	/** 职位： 副总经理1050 */
	public static String POSITION_1_2 = "1050";
	/** 职位： 区域总经理1100 */
	public static String POSITION_1_3 = "1100";
	/** 职位： 区域副总经理1150 */
	public static String POSITION_1_4 = "1150";
	/** 职位： 财务总监 1180-new Add */
	public static String POSITION_1_8 = "1180";
	/** 职位： 分公司经理1200 */
	public static String POSITION_1_5 = "1200";
	/** 职位： 分公司副经理1250 */
	public static String POSITION_1_6 = "1250";
	/** 职位： 直管项目部经理1260 */
	public static String POSITION_1_7 = "1260";
	/** 职位： 办公室主任2000 */
	public static String POSITION_2_1 = "2000";
	/** 职位： 行政人事经理2010 */
	public static String POSITION_2_2 = "2010";
	/** 职位： 行政经理2020-del */
	/* public static String POSITION_2_3 = "2020"; */
	/** 职位： 财务经理2100 */
	public static String POSITION_2_4 = "2100";
	/** 职位： 总经理助理2101 */
	public static String POSITION_2_5 = "2101";
	/** 职位： 区域经理助理2110 */
	/*
	 * public static String POSITION_2_6 = "2110";
	 *//** 职位： 分公司经理助理2120 *//*
							 * public static String POSITION_2_7 = "2120";
							 */
	/** 职位： 财务副经理2150 */
	public static String POSITION_2_8 = "2150";
	/** 职位： 品质经理2200 */
	public static String POSITION_2_9 = "2200";
	/** 职位： 工业部经理2300 */
	public static String POSITION_2_10 = "2300";
	/** 职位： 商业部经理2400 */
	public static String POSITION_2_11 = "2400";
	/** 职位： 工程经理2500 */
	public static String POSITION_2_12 = "2500";
	/** 职位： 客服经理2600 */
	public static String POSITION_2_13 = "2600";
	/** 职位： 秩序维护部经理2700 */
	public static String POSITION_2_14 = "2700";
	/** 职位： 环境部经理2800 */
	public static String POSITION_2_15 = "2800";
	/** 职位： 项目经理2900 */
	public static String POSITION_2_16 = "2900";
	/** 职位： 案场经理2910 */
	public static String POSITION_2_17 = "2910";
	/** 职位： 人力资源主管3010 */
	public static String POSITION_3_1 = "3010";
	/** 职位： 行政主管3020 -- del */
	/* public static String POSITION_3_2 = "3020"; */
	/** 职位： 行政主管3030 */
	public static String POSITION_3_2_0 = "3030";

	/** 职位： 办公室专员3030 */
	public static String POSITION_3_3 = "3030";
	/** 职位： 法务3040 */
	public static String POSITION_3_4 = "3040";
	/** 职位： 财务主管3110 */
	public static String POSITION_3_5 = "3110";
	/** 职位： 财务专员3120 */
	public static String POSITION_3_6 = "3120";
	/** 职位： 出纳3130 */
	public static String POSITION_3_7 = "3130";
	/** 职位： 品质主管3210 */
	public static String POSITION_3_8 = "3210";
	/** 职位： 品质专员3220 */
	public static String POSITION_3_9 = "3220";
	/** 职位： 商业部主管3410 */
	public static String POSITION_3_10 = "3410";
	/** 职位： 工程主管3510 */
	public static String POSITION_3_11 = "3510";
	/** 职位： 工程领班3520 */
	public static String POSITION_3_12 = "3520";
	/** 职位： 客服主管3610 */
	public static String POSITION_3_13 = "3610";
	/** 职位： 客服领班3620 */
	public static String POSITION_3_13_1 = "3620";
	/** 职位： 秩序维护主管3710 */
	public static String POSITION_3_14 = "3710";
	/** 职位： 消防主管3720 */
	public static String POSITION_3_15 = "3720";
	/** 职位： 秩序维护领班3730 */
	public static String POSITION_3_16 = "3730";
	/** 职位： 环境部主管3810 */
	public static String POSITION_3_17 = "3810";
	/** 职位： 环境部领班3820 */
	public static String POSITION_3_18 = "3820";
	/** 职位： 项目/小区经理助理3910 */
	public static String POSITION_3_19 = "3910";
	/** 职位： 案场主管3920 */
	public static String POSITION_3_20 = "3920";
	/** 职位： 仓库管理员4010 */
	public static String POSITION_4_1 = "4010";
	/** 职位： 信息维护4020 */
	public static String POSITION_4_2 = "4020";
	/** 职位： 司机4030 */
	public static String POSITION_4_3 = "4030";
	/** 职位： 行政后勤4040 */
	public static String POSITION_4_4 = "4040";
	/** 职位： 数据录入员4110 */
	public static String POSITION_4_5 = "4110";
	/** 职位： 维修工4510 */
	public static String POSITION_4_6 = "4510";
	/** 职位： 高配电工4520 */
	public static String POSITION_4_7 = "4520";
	/** 职位： 消控维保4530 */
	public static String POSITION_4_8 = "4530";
	/** 职位： 客服及收费4610 */
	public static String POSITION_4_9 = "4610";
	/** 职位： 秩序维护员4710 */
	public static String POSITION_4_10 = "4710";
	/** 职位： 车辆收费员4720 */
	public static String POSITION_4_11 = "4720";
	/** 职位： 消控中心4730 */
	public static String POSITION_4_12 = "4730";
	/** 职位： 保洁员4810 */
	public static String POSITION_4_13 = "4810";
	/** 职位： 绿化工4820 */
	public static String POSITION_4_14 = "4820";
	/** 职位： 软件工程师9000 */
	public static String POSITION_9_1 = "9000";

	/** 导入外包公司的数据 对应的日志 周报 考勤的关键字 **/
	public static String KEY_WORD_1 = "journal";
	public static String KEY_WORD_2 = "reportWeek";
	public static String KEY_WORD_3 = "attendance";

	@SuppressWarnings({ "unused" })
	/*public static Map<String, Object> getMobileEntity(Object entity, String spiltType) {
		if (spiltType == null) {
			spiltType = "@";
		}
		Map<String, Object> map = Maps.newHashMap();

		List<String> field = Lists.newArrayList();
		List<String> value = Lists.newArrayList();
		List<String> chinesName = Lists.newArrayList();

		try {
			for (Method m : entity.getClass().getMethods()) {
				if (m.getAnnotation(JsonIgnore.class) == null && m.getAnnotation(JsonBackReference.class) == null
						&& m.getName().startsWith("get")) {
					if (m.isAnnotationPresent(FieldName.class)) {
						Annotation p = m.getAnnotation(FieldName.class);
						FieldName fieldName = (FieldName) p;
						chinesName.add(fieldName.value());
					} else {
						chinesName.add("");
					}
					if (m.getName().equals("getAct")) {
						Object act = m.invoke(entity, new Object[] {});
						Method actMet = act.getClass().getMethod("getTaskId");
						map.put("taskId", ObjectUtils.toString(m.invoke(act, new Object[] {}), ""));
					} else {
						field.add(StringUtils.uncapitalize(m.getName().substring(3)));
						value.add(ObjectUtils.toString(m.invoke(entity, new Object[] {}), ""));
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		map.put("beanTitles", StringUtils.join(field, spiltType));
		map.put("beanInfos", StringUtils.join(value, spiltType));
		map.put("chineseNames", StringUtils.join(chinesName, spiltType));

		return map;
	}*/

	/**
	 * 获取流程表单URL
	 * 
	 * @param formKey
	 * @param act
	 *            表单传递参数
	 * @return
	 */
	/*public static String getFormUrl(String formKey, Act act) {

		StringBuilder formUrl = new StringBuilder();

		String formServerUrl = Global.getConfig("activiti.form.server.url");
		if (StringUtils.isBlank(formServerUrl)) {
			formUrl.append(Global.getAdminPath());
		} else {
			formUrl.append(formServerUrl);
		}

		formUrl.append(formKey).append(formUrl.indexOf("?") == -1 ? "?" : "&");
		formUrl.append("act.taskId=").append(act.getTaskId() != null ? act.getTaskId() : "");
		formUrl.append("&act.taskName=").append(act.getTaskName() != null ? Encodes.urlEncode(act.getTaskName()) : "");
		formUrl.append("&act.taskDefKey=").append(act.getTaskDefKey() != null ? act.getTaskDefKey() : "");
		formUrl.append("&act.procInsId=").append(act.getProcInsId() != null ? act.getProcInsId() : "");
		formUrl.append("&act.procDefId=").append(act.getProcDefId() != null ? act.getProcDefId() : "");
		formUrl.append("&act.status=").append(act.getStatus() != null ? act.getStatus() : "");
		formUrl.append("&id=").append(act.getBusinessId() != null ? act.getBusinessId() : "");

		return formUrl.toString();
	}*/

	/**
	 * 转换流程节点类型为中文说明
	 * 
	 * @param type
	 *            英文名称
	 * @return 翻译后的中文名称
	 */
	public static String parseToZhType(String type) {
		Map<String, String> types = new HashMap<String, String>();
		types.put("userTask", "用户任务");
		types.put("serviceTask", "系统任务");
		types.put("startEvent", "开始节点");
		types.put("endEvent", "结束节点");
		types.put("exclusiveGateway", "条件判断节点(系统自动根据条件处理)");
		types.put("inclusiveGateway", "并行处理任务");
		types.put("callActivity", "子流程");
		return types.get(type) == null ? type : types.get(type);
	}

/*	public static UserEntity toActivitiUser(ActUser user) {
		if (user == null) {
			return null;
		}
		UserEntity userEntity = new UserEntity();
		userEntity.setId(user.getLoginName());
		userEntity.setFirstName(user.getName());
		userEntity.setLastName(StringUtils.EMPTY);
		userEntity.setPassword(user.getPassword());
		userEntity.setEmail(user.getEmail());
		userEntity.setRevision(1);
		return userEntity;
	}*/

	/*public static GroupEntity toActivitiGroup(ActRole role) {
		if (role == null) {
			return null;
		}
		GroupEntity groupEntity = new GroupEntity();
		groupEntity.setId(role.getEnname());
		groupEntity.setName(role.getName());
		groupEntity.setType(role.getRoleType());
		groupEntity.setRevision(1);
		return groupEntity;
	}*/

	/*public static void main(String[] args) {
		ActUser user = new ActUser();
		System.out.println(getMobileEntity(user, "@"));
	}*/
}
